home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / site2.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  29KB  |  1,054 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
  2. /* site2.c */
  3. /* 2nd half of site functions and aux functions to them */
  4.  
  5. #include "glob.h"
  6.  
  7.  
  8.  
  9. void l_condo()
  10. {
  11.   pol ol,prev=NULL;
  12.   int i,done=FALSE,over=FALSE,weeksleep=FALSE;
  13.   char response;
  14.  
  15.   if (! gamestatusp(SOLD_CONDO)) {
  16.     print1("Rampart Arms. Weekly Rentals and Purchases");
  17.     print2("Which are you interested in [r,p, or ESCAPE] ");
  18.     response = mgetc();
  19.     if (response == 'p') {
  20.       print2("Only 50,000Au. Buy it? [yn] ");
  21.       if (ynq2()=='y') {
  22.     if (Player.cash < 50000) 
  23.       print3("No mortgages, buddy.");
  24.     else {
  25.       setgamestatus(SOLD_CONDO);
  26.       Player.cash-=50000;
  27.       dataprint();
  28.       print2("You are the proud owner of a luxurious condo penthouse.");
  29.       Condoitems = NULL;
  30.     }
  31.       }
  32.     }
  33.     else if (response == 'r') {
  34.       print2("Weekly Rental, 1000Au. Pay for it? [yn] ");
  35.       if (ynq2()=='y') {
  36.     if (Player.cash < 1000)
  37.       print2("Hey, pay the rent or out you go....");
  38.     else {
  39.       weeksleep = TRUE;
  40.       Player.cash -=1000;
  41.       dataprint();
  42.     }
  43.       }
  44.     }
  45.     else print2("Please keep us in mind for your housing needs.");
  46.   }
  47.   else {
  48.     while (! done) {
  49.       menuclear();
  50.       menuprint("Home Sweet Home\n");
  51.       menuprint("a: Leave items in your safe.\n");
  52.       menuprint("b: Retrieve items.\n");
  53.       menuprint("c: Take a week off to rest.\n");
  54.       menuprint("d: Retire permanently.\n");
  55.       menuprint("ESCAPE: Leave this place.\n");
  56.       showmenu();
  57.       response = (char) mcigetc();
  58.       if (response == 'a') {
  59.     i = getitem(NULL_ITEM);
  60.     if (i != ABORT) {
  61.       if (Player.possessions[i]->blessing < 0) 
  62.         print2("The item just doesn't want to be stored away...");
  63.       else {
  64.         ol = ((pol) checkmalloc(sizeof(oltype)));
  65.         ol->thing = Player.possessions[i];
  66.         ol->next = Condoitems;
  67.         Condoitems = ol;
  68.         conform_unused_object(Player.possessions[i]);
  69.         Player.possessions[i] = NULL;
  70.       }
  71.     }
  72.       }
  73.       else if (response == 'b') {
  74.     ol = Condoitems;
  75.     while ((ol != NULL) && (! over)) {
  76.       print1("Retrieve ");
  77.       nprint1(itemid(ol->thing));
  78.       nprint1(" [ynq] ");
  79.       response = (char) mcigetc();
  80.       if (response == 'y') {
  81.         gain_item(ol->thing);
  82.         if (ol == Condoitems)
  83.           Condoitems = Condoitems->next;
  84.         else if (prev != NULL) prev->next = ol->next;
  85.       }
  86.       else if (response == 'q')
  87.         over = TRUE;
  88.       prev = ol;
  89.       ol = ol->next;
  90.     }
  91.       }
  92.       else if (response == 'c') weeksleep = TRUE;
  93.       else if (response == 'd') {
  94.     clearmsg();
  95.     print1("You sure you want to retire, now? [yn] ");
  96.     if (ynq1() == 'y') {
  97.       p_win();
  98.     }
  99.       }
  100.       else if (response == ESCAPE) done = TRUE;
  101.     }
  102.     xredraw();
  103.   }
  104.   if (weeksleep) {
  105.     clearmsg();
  106.     print1("Taking a week off to rest...");
  107.     morewait();
  108.     toggle_item_use(TRUE);
  109.     Player.hp = Player.maxhp;
  110.     Player.str = Player.maxstr;
  111.     Player.agi = Player.maxagi;
  112.     Player.con = Player.maxcon;
  113.     Player.dex = Player.maxdex;
  114.     Player.iq = Player.maxiq;
  115.     Player.pow = Player.maxpow;
  116.     for (i=0;i<NUMSTATI;i++)
  117.       if (Player.status[i]<1000) Player.status[i]=0;
  118.     toggle_item_use(FALSE);
  119.     Player.food = 36;
  120.     print2("You're once again fit and ready to continue your adventure.");
  121.     Time += 60*24*7;
  122.     Date += 7;
  123.     moon_check();
  124.     timeprint();
  125.   }
  126. }
  127.  
  128.  
  129.  
  130.  
  131. void gymtrain(maxstat,stat)
  132. int *maxstat,*stat;
  133. {
  134.   if (Gymcredit + Player.cash < 2000)
  135.     print2("You can't afford our training!");
  136.   else {
  137.     if (Gymcredit > 2000) Gymcredit -= 2000;
  138.     else {
  139.       Player.cash -= (2000-Gymcredit);
  140.       Gymcredit = 0;
  141.     }
  142.     print2("Sweat. Sweat. ");
  143.     if ((*maxstat < 30) && 
  144.     ((*maxstat < random_range(30)) || (random_range(3)==1))){
  145.       nprint2("The training pays off!");
  146.       (*maxstat)++;
  147.       (*stat)++;
  148.     }
  149.     else {
  150.       nprint2("You feel the healthy glow of a good workout.");
  151.       if (*stat < *maxstat) {
  152.     (*stat)++;
  153.     print3("A feeling of rehabilitation washes through you.");
  154.       }
  155.     }
  156.   }
  157.   dataprint();
  158. }
  159.  
  160. void healforpay()
  161. {
  162.   if (Player.cash < 50)
  163.     print2("You can't afford to be healed!");
  164.   else {
  165.     Player.cash -= 50;
  166.     Player.hp += 20+random_range(20);
  167.     if (Player.hp > Player.maxhp) 
  168.       Player.hp = Player.maxhp;
  169.     print2("Another medical marvel....");
  170.   }
  171.   calc_melee();
  172. }
  173.  
  174. void cureforpay()
  175. {
  176.   if (Player.cash < 250)
  177.     print2("You can't afford to be cured!");
  178.   else {
  179.     Player.cash -= 250;
  180.     Player.status[DISEASED] = 0;
  181.     print2("Quarantine lifted....");
  182.   }
  183. }  
  184.  
  185.  
  186.  
  187. void pacify_guards()
  188. {
  189.   pml ml;
  190.  
  191.   for(ml=Level->mlist;ml!=NULL;ml=ml->next)
  192.     if ((ml->m->id == ML0+3) || /*guard*/
  193.     ((ml->m->id == ML0+8) && (ml->m->aux2 == 15))) {/* justiciar */
  194.       m_status_reset(ml->m,HOSTILE);
  195.       ml->m->specialf = M_NO_OP;
  196.       if (ml->m->id == ML0+3 && ml->m->hp > 0 && ml->m->aux1 > 0) {
  197.     if (Level->site[ml->m->x][ml->m->y].creature == ml->m)
  198.       Level->site[ml->m->x][ml->m->y].creature = NULL;
  199.     ml->m->x = ml->m->aux1;
  200.     ml->m->y = ml->m->aux2;
  201.     Level->site[ml->m->x][ml->m->y].creature = ml->m;
  202.       }
  203.       else if (ml->m->id == ML0+8 && ml->m->hp > 0 &&
  204.       Current_Environment == E_CITY) {
  205.     if (Level->site[ml->m->x][ml->m->y].creature == ml->m)
  206.       Level->site[ml->m->x][ml->m->y].creature = NULL;
  207.     ml->m->x = 40;
  208.     ml->m->y = 62;
  209.     Level->site[ml->m->x][ml->m->y].creature = ml->m;
  210.       }
  211.     }
  212.     if (Current_Environment == E_CITY)
  213. #ifdef AMIGA
  214.     {
  215.       int fix1 = 40;
  216.       int fix2 = 60;
  217.       Level->site[fix1][fix2].p_locf = L_ORDER; /* undoes action in alert_guards */
  218.     }
  219. #else
  220.       Level->site[40][60].p_locf = L_ORDER; /* undoes action in alert_guards */
  221. #endif
  222. }
  223.  
  224. void send_to_jail()
  225. {
  226.   if (Player.rank[ORDER] > 0) {
  227.     print1("A member of the Order of Paladins sent to jail!");
  228.     print2("It cannot be!");
  229.     morewait();
  230.     print1("You are immediately expelled permanently from the Order!");
  231.     print2("Your name is expunged from the records....");
  232.     Player.rank[ORDER] = -1;
  233.   }
  234.   else if (gamestatusp(DESTROYED_ORDER)) 
  235.     print1("The destruction of the Order of Paladins has negated the law!");
  236.   else if ((Current_Environment != E_CITY) &&
  237.        (Last_Environment != E_CITY)) 
  238.     print1("Fortunately, there is no jail around here, so you are freed!");
  239.   else {
  240.     pacify_guards();
  241.     if (((Current_Environment == E_HOUSE) || 
  242.      (Current_Environment == E_MANSION) ||
  243.      (Current_Environment == E_HOVEL)) &&
  244.     (Last_Environment == E_CITY))
  245.     {
  246.       setgamestatus(SUPPRESS_PRINTING);
  247.       change_environment(E_CITY);
  248.       resetgamestatus(SUPPRESS_PRINTING);
  249.     }
  250.     if (Current_Environment == E_CITY) {
  251.       if (gamestatusp(UNDEAD_GUARDS)) {
  252.     print1("You are taken to a weirdly deserted chamber where an undead");
  253.     print2("Magistrate presides over a court of ghosts and haunts.");
  254.     morewait();
  255.     print1("'Mr. Foreman, what is the verdict?'");
  256.     print2("'Guilty as charged, your lordship.'");
  257.     morewait();
  258.     clearmsg();
  259.     print1("'Guilty...");
  260.     morewait();
  261.     nprint1("Guilty...");
  262.     morewait();
  263.     nprint1("Guilty...");
  264.     morewait();
  265.     nprint1("Guilty...'");
  266.     clearmsg();
  267.     print1("The members of the court close in around, fingers pointing.");
  268.     print2("You feel insubstantial hands closing around your throat....");
  269.     print3("You feel your life draining away!");
  270.     while(Player.level > 0) {
  271.       Player.level--;
  272.       Player.xp /= 2;
  273.       Player.hp /= 2;
  274.       dataprint();
  275.     }
  276.     Player.maxhp = Player.maxcon;
  277.     morewait();
  278.     print1("You are finally released, a husk of your former self....");
  279.     Player.x = 58;
  280.     Player.y = 40;
  281.     screencheck(58);
  282.       }
  283.       else if (Player.alignment + random_range(200) < 0) {
  284.     print1("Luckily for you, a smooth-tongued advocate from the");
  285.     print2("Rampart Chaotic Liberties Union gets you off!");
  286.     Player.x = 58;
  287.     Player.y = 40;
  288.     screencheck(58);
  289.       }
  290.       else switch(Imprisonment++) {
  291.       case 0:
  292.     print1("The Magistrate sternly reprimands you.");
  293.     print2("As a first-time offender, you are given probation.");
  294.     Player.y = 58;
  295.     Player.x = 40;
  296.     screencheck(58);
  297.     break;
  298.       case 1:
  299.     print1("The Magistrate expresses shame for your conduct.");
  300.     print2("You are thrown in jail!");
  301.     morewait();    
  302.     repair_jail();
  303.     Player.y = 54;
  304.     Player.x = 37 + (2*random_range(4));
  305.     screencheck(54);
  306.     l_portcullis_trap();
  307.     break;
  308.       default:
  309.     print1("The Magistrate renders summary judgement.");
  310.     print2("You are sentenced to prison!");
  311.     morewait();
  312.     print1("The guards recognize you as a 'three-time-loser'"); 
  313.     print2("...and beat you up a little to teach you a lesson.");
  314.     p_damage(random_range(Imprisonment * 10),
  315.          UNSTOPPABLE,
  316.          "police brutality");
  317.     morewait();
  318.     repair_jail();
  319.     Player.y = 54;
  320.     Player.x = 37 + (2*random_range(4));
  321.     screencheck(54);
  322.     l_portcullis_trap();
  323.       }
  324.     }
  325.   }
  326. }
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333. void l_adept()
  334. {
  335.   print1("You see a giant shimmering gate in the form of an omega.");
  336.   if (! gamestatusp(ATTACKED_ORACLE)) {
  337.     if (Player.str+Player.con+Player.iq+Player.pow < 100)
  338.       print2("A familiar female voice says: I would not advise this now....");
  339.     else print2("A familiar female voice says: Go for it!");
  340.     morewait();
  341.     clearmsg();
  342.   }
  343.   print2("Enter the mystic portal? [yn] ");
  344.   if (ynq2()!='y') {
  345.     if (Player.level > 100) {
  346.       print1("The Lords of Destiny spurn your cowardice....");
  347.       Player.xp = 0;
  348.       Player.level = 0;
  349.       Player.hp = Player.maxhp = Player.con;
  350.       Player.mana = calcmana();
  351.       print2("You suddenly feel very inexperienced.");
  352.       dataprint();
  353.     }    
  354.   }
  355.   else {
  356.     clearmsg();
  357.     print1("You pass through the portal.");
  358.     morewait();
  359.     drawomega();
  360.     print1("Like wow man! Colors! ");
  361.     if (Player.patron != DESTINY) {
  362.       print2("Strange forces try to tear you apart!");
  363.       p_damage(random_range(200),UNSTOPPABLE,"a vortex of chaos");
  364.     }
  365.     else print2("Some strange force shields you from a chaos vortex!");
  366.     morewait();
  367.     print1("Your head spins for a moment....");
  368.     print2("and clears....");
  369.     morewait();
  370.     Player.hp = Player.maxhp;
  371.     Player.mana = calcmana();
  372.     change_environment(E_ABYSS);
  373.   }
  374. }
  375.  
  376.  
  377.  
  378.  
  379. void l_trifid()
  380. {
  381.   int damage=0,stuck=TRUE;
  382.   print1("The hedge comes alive with a surge of alien growth!");
  383.   while (stuck) {
  384.     dataprint();
  385.     damage += Level->depth/2+1;
  386.     print2("Razor-edged vines covered in suckers attach themselves to you.");
  387.     morewait();
  388.     if (find_and_remove_item(THINGID+6,-1)) {
  389.       print1("Thinking fast, you toss salt water on the trifid...");
  390.       print2("The trifid disintegrates with a frustrated sigh.");
  391.       Level->site[Player.x][Player.y].locchar = FLOOR;
  392.       Level->site[Player.x][Player.y].p_locf = L_NO_OP;
  393.       lset(Player.x, Player.y, CHANGED);
  394.       gain_experience(1000);
  395.       stuck = FALSE;
  396.     }
  397.     else {
  398.       p_damage(damage,UNSTOPPABLE,"a trifid");
  399.       morewait();
  400.       print1("You are entangled in tendrils...");
  401.       menuclear();
  402.       menuprint("a: Try to break free.\n");
  403.       menuprint("b: Hang limp and hope the tendrils uncoil.\n");
  404.       menuprint("c: Pray for assistance.\n");
  405.       menuprint("d: Attempt to bargain with the hedge.\n");
  406.       menuprint("e: Click your heels together and wish for escape.\n");
  407.       menuprint("ANYTHING ELSE: writhe and scream hopelessly.\n");
  408.       showmenu();
  409.       switch(menugetc()) {
  410.       case 'a': 
  411.     if (Player.str > random_range(200)) {
  412.       print1("Amazing! You're now free.");
  413.       print2("The trifid writhes hungrily at you.");
  414.       stuck = FALSE;
  415.     }
  416.     else print1("Well, THAT didn't work.");
  417.     break;
  418.       case 'b': 
  419.     print1("Well, at least you're facing your fate with dignity.");
  420.     break;
  421.       case 'c': 
  422.     if ((Player.patron == DRUID) && 
  423.         (Player.rank[PRIESTHOOD] > random_range(5))) {
  424.         print1("A shaft of golden light bathes the alien plant");
  425.         print2("which grudginly lets you go....");
  426.         stuck = FALSE;
  427.       }
  428.     else print1("You receive no divine aid as yet.");
  429.     break;
  430.       case 'd':
  431.     print1("The hedge doesn't answer your entreaties.");
  432.     break;
  433.       case 'e':
  434.     print1("You forgot your ruby slippers, stupid.");
  435.     break;
  436.       default:
  437.     print1("The hedge enjoys your camp play-acting....");
  438.     break;
  439.       }
  440.     }
  441.   }
  442.   xredraw();
  443. }
  444.  
  445.  
  446.  
  447.  
  448. void l_vault()
  449. {
  450.   print1("You come to a thick vault door with a complex time lock.");
  451.   if ((hour()==23)) {
  452.     print2("The door is open.");
  453.     Level->site[12][56].locchar = FLOOR;
  454.   }
  455.   else {
  456.     print2("The door is closed.");
  457.     Level->site[12][56].locchar = WALL;
  458.     morewait();
  459.     clearmsg();
  460.     print1("Try to crack it? [yn] ");
  461.     if (ynq1()=='y') {
  462.       if (random_range(100) < Player.rank[THIEVES]*Player.rank[THIEVES]) {
  463.     print2("The lock clicks open!!!");
  464.     gain_experience(5000);
  465.     Level->site[12][56].locchar = FLOOR;
  466.       }    
  467.       else {
  468.     print2("Uh, oh, set off the alarm.... The castle guard arrives....");
  469.     morewait();
  470.     if (Player.rank[NOBILITY] == DUKE) {
  471.       clearmsg();
  472.       print1("\"Ah, just testing us, your Grace?  I hope we're up to scratch.\"");
  473.       morewait();
  474.     }
  475.     else
  476.       send_to_jail();
  477.       }
  478.     }
  479.     else print2("Good move.");
  480.   }
  481. }
  482.  
  483.  
  484. void l_brothel()
  485. {
  486.   char response;
  487.   print1("You come to a heavily reinforced inner door.");
  488.   print2("A sign reads `The House of the Eclipse'");
  489.   morewait();
  490.   clearmsg();
  491.   print1("Try to enter? [yn] ");
  492.   if (ynq1()=='y') {
  493.     menuclear();
  494.     menuprint("a:knock on the door.\n");
  495.     menuprint("b:try to pick the lock.\n");
  496.     menuprint("c:bash down the door.\n");
  497.     menuprint("ESCAPE: Leave this house of ill repute.\n");
  498.     showmenu();
  499.     do 
  500.       response = menugetc();
  501.     while ((response != 'a') &&
  502.        (response != 'b') &&
  503.        (response != 'c') &&
  504.        (response != ESCAPE));
  505.     xredraw();
  506.     if (response == 'a') {
  507.       if (!nighttime())
  508.     print2("There is no reponse.");
  509.       else {
  510.     print1("A window opens in the door.");
  511.     print2("`500Au, buddy. For the night.' pay it? [yn] ");
  512.     if (ynq2()=='y') {
  513.       if (Player.cash < 500) {
  514.         print1("`What, no roll?!'");
  515.         print2("The bouncer bounces you a little and lets you go.");
  516.         p_damage(25,UNSTOPPABLE,"da bouncer");
  517.       }
  518.       else {
  519.         Player.cash -= 500;
  520.         print1("You are ushered into an opulently appointed hall.");
  521.         print2("After an expensive dinner (takeout from Les Crapuleux)");
  522.         morewait();
  523.         if (Player.preference == 'n') {
  524.           switch(random_range(4)) {
  525.           case 0:
  526.         print1("you spend the evening playing German Whist with");
  527.         break;
  528.           case 1:
  529.         print1("you spend the evening discussing philosophy with");
  530.         break;
  531.           case 2:
  532.         print1("you spend the evening playing chess against");
  533.         break;
  534.           case 3:
  535.         print1("you spend the evening telling your adventures to");
  536.           }
  537.           print2("various employees of the House of the Eclipse.");
  538.         }
  539.         else {
  540.           print1("you spend an enjoyable and educational evening with");
  541.           if (Player.preference == 'm' ||
  542.           (Player.preference == 'y' && random_range(2)))
  543.         switch(random_range(4)) {
  544.         case 0: 
  545.           print2("Skarn the Insatiable, a satyr.");
  546.           break;
  547.         case 1: 
  548.           print2("Dryden the Defanged, an incubus.");
  549.           break;
  550.         case 2: 
  551.           print2("Gorgar the Equipped, a centaur.");
  552.           break;
  553.         case 3: 
  554.           print2("Hieronymus, the mendicant priest of Eros.");
  555.           break;
  556.         }    
  557.           else switch(random_range(4)) {
  558.           case 0: 
  559.         print2("Noreen the Nymph (omaniac)");
  560.         break;
  561.           case 1: 
  562.         print2("Angelface, a recanted succubus.");
  563.         break;
  564.           case 2: 
  565.         print2("Corporal Sue of the City Guard (moonlighting).");
  566.         break;
  567.           case 3: 
  568.         print2("Sheena the Queena the Jungle, a wereleopard.");
  569.         break;
  570.           }    
  571.         }
  572.         morewait();
  573.         if (hour() > 12) Time += ((24-hour())+8) * 60;
  574.         else {
  575.           Time += ((9-hour())*60);
  576.           Date++;
  577.         }
  578.         Player.food = 40;
  579.         Player.status[DISEASED] = 0;
  580.         Player.status[POISONED] = 0;
  581.         Player.hp = Player.maxhp;
  582.         /* reduce temporary stat gains to max stat levels */
  583.         toggle_item_use(TRUE);
  584.         Player.str = min(Player.str,Player.maxstr);
  585.         Player.con = min(Player.con,Player.maxcon);
  586.         Player.agi = min(Player.agi,Player.maxagi);
  587.         Player.dex = min(Player.dex,Player.maxdex);
  588.         Player.iq = min(Player.iq,Player.maxiq);
  589.         Player.pow = min(Player.pow,Player.maxpow);
  590.         toggle_item_use(FALSE);
  591.         if (Player.preference == 'n')
  592.           Player.iq++; /* whatever :-) */
  593.         else
  594.           Player.con++;
  595.         gain_experience(100);
  596.         timeprint();
  597.         dataprint();
  598.         showflags();
  599.         morewait();
  600.         clearmsg();
  601.         if (Player.preference == 'n')
  602.           print1("You arise refreshed the next morning...");
  603.         else
  604.           print1("You arise, tired but happy, the next morning...");
  605.       }
  606.     }
  607.     else print2("What are you, some kinda prude?");
  608.       }
  609.     }
  610.     else if (response == 'b') {
  611.       if (nighttime()) {
  612.     print1("As you fumble at the lock, the door opens....");
  613.     print2("The bouncer tosses you into the street.");
  614.       }
  615.       else print1("The door appears to be bolted and barred from behind.");
  616.     }
  617.     else if (response == 'c') {
  618.       if (nighttime()) {
  619.     print1("As you charge toward the door it opens....");
  620.     print2("Yaaaaah! Thud!");
  621.     morewait();
  622.     print1("You run past the startled bouncer into a wall.");
  623.     p_damage(20,UNSTOPPABLE,"a move worthy of Clouseau");
  624.     print2("The bouncer tosses you into the street.");
  625.       }
  626.       else {
  627.     print1("Ouch! The door resists your efforts.");
  628.     p_damage(1,UNSTOPPABLE,"a sturdy door");
  629.     morewait();
  630.     print1("You hear an irritated voice from inside:");
  631.     print2("'Keep it down out there! Some of us are trying to sleep!'");
  632.       }
  633.     }
  634.   }
  635. }
  636.  
  637.  
  638.  
  639. #ifndef MSDOS
  640. /* if signp is true, always print message, otherwise do so only sometimes */
  641. void sign_print(x,y,signp)
  642. int x,y,signp;
  643. {
  644.   if ((Level->site[x][y].p_locf >= CITYSITEBASE) &&
  645.       (Level->site[x][y].p_locf < CITYSITEBASE+NUMCITYSITES))
  646.     CitySiteList[Level->site[x][y].p_locf - CITYSITEBASE][0] = TRUE;
  647.   switch(Level->site[x][y].p_locf) {
  648.   case L_CHARITY:
  649.     print1("You notice a sign: The Rampart Orphanage And Hospice For The Needy.");
  650.     break;
  651.   case L_MANSION:
  652.     print1("You notice a sign:");
  653.     print2("This edifice protected by DeathWatch Devices, Ltd.");
  654.     morewait();
  655.     break;
  656.   case L_GRANARY:  
  657.     print1("You notice a sign:");
  658.     print2("Public Granary: Entrance Strictly Forbidden.");
  659.     break;
  660.   case L_PORTCULLIS:
  661.     if (Level->site[x][y].locchar == FLOOR)
  662.       print1("You see a groove in the floor and slots above you.");
  663.     break;
  664.   case L_STABLES:
  665.     print1("You notice a sign:");
  666.     print2("Village Stables");
  667.     break;
  668.   case L_COMMONS:
  669.     print1("You notice a sign:");
  670.     print2("Village Commons: No wolves allowed.");
  671.     break;
  672.   case L_MAZE:
  673.     print1("You notice a sign:");
  674.     print2("Hedge maze closed for trifid extermination.");
  675.     break;
  676.   case L_BANK:
  677.     if (signp) {
  678.       print1("You notice a sign:");
  679.       print2("First Bank of Omega: Autoteller Carrel.");
  680.     }
  681.     break;
  682.   case L_TEMPLE:
  683.     print1("You see the ornate portico of the Rampart Pantheon");
  684.     break;
  685.   case L_ARMORER:
  686.     if (signp) {
  687.       print1("You notice a sign:");
  688.       print2("Julie's Armor of Proof and Weapons of Quality");
  689.     }
  690.     break;
  691.   case L_CLUB:
  692.     if (signp) {
  693.       print1("You notice a sign:");
  694.       print2("Rampart Explorers' Club.");
  695.     }
  696.     break;
  697.   case L_GYM:
  698.     if (signp) {
  699.       print1("You notice a sign:");
  700.       print2("The Rampart Gymnasium, (affil. Rampart Coliseum).");
  701.     }
  702.     break;
  703.   case L_HEALER:
  704.     if (signp) {
  705.       print1("You notice a sign:");
  706.       print2("Rampart Healers. Member RMA.");
  707.     }
  708.     break;
  709.   case L_CASINO:
  710.     if (signp) {
  711.       print1("You notice a sign:");
  712.       print2("Rampart Mithril Nugget Casino.");
  713.     }
  714.     break;
  715.   case L_SEWER:
  716.     print1("A sewer entrance. You don't want to go down THERE, do you?");
  717.     break;
  718.   case L_COMMANDANT:
  719.     if (signp) {
  720.       print1("You notice a sign:");
  721.       print2("Commandant Sonder's Rampart-fried Lyzzard partes. Open 24 hrs.");
  722.     }
  723.     break;
  724.   case L_DINER:
  725.     if (signp) {
  726.       print1("You notice a sign:");
  727.       print2("The Rampart Diner. All you can eat, 25Au.");
  728.     }
  729.     break;
  730.   case L_CRAP:
  731.     if (signp) {
  732.       print1("You notice a sign:"); 
  733.       print2("Les Crapeuleaux. (****)");
  734.     }
  735.     break;
  736.   case L_TAVERN:
  737.     if (signp) {
  738.       print1("You notice a sign:"); 
  739.       print2("The Centaur and Nymph -- J. Riley, prop.");
  740.     }
  741.     break;
  742.   case L_ALCHEMIST:
  743.     if (signp) {
  744.       print1("You notice a sign:"); 
  745.       print2("Ambrosias' Potions et cie.");
  746.     }
  747.     break;
  748.   case L_DPW:
  749.     if (signp) {
  750.       print1("You notice a sign:"); 
  751.       print2("Rampart Department of Public Works.");
  752.     }
  753.     break;
  754.   case L_LIBRARY:
  755.     if (signp) {
  756.       print1("You notice a sign:"); 
  757.       print2("Rampart Public Library.");
  758.     }
  759.     break;
  760.   case L_CONDO:
  761.     if (signp) {
  762.       print1("You notice a sign:"); 
  763.       if (gamestatusp(SOLD_CONDO)) 
  764.     print2("Home Sweet Home");
  765.       else print2("Luxury Condominium For Sale; Inquire Within");
  766.     }
  767.     break;
  768.   case L_PAWN_SHOP:
  769.     if (signp) {
  770.       print1("You notice a sign:"); 
  771.       print2("Knight's Pawn Shop.");
  772.     }
  773.     break;
  774.   case L_CEMETARY:
  775.     print1("You notice a sign:"); 
  776.     print2("Rampart City Cemetary. Closed -- Full.");
  777.     break;
  778.   case L_GARDEN:
  779.     print1("You notice a sign:"); 
  780.     print2("Rampart Botanical Gardens---Do not deface statues.");
  781.     break;
  782.   case L_JAIL:
  783.     print1("You notice a sign:"); 
  784.     print2("Rampart City Gaol -- always room for more.");
  785.     break;
  786.   case L_ORACLE:
  787.     print1("You notice a sign:");
  788.     print2("The Oracle of the Cyan Flames");
  789.     morewait();
  790.     break;
  791.   }
  792. }
  793. #endif
  794.   
  795.  
  796.  
  797. void l_countryside()
  798. {
  799.   change_environment(E_COUNTRYSIDE);
  800. }
  801.  
  802.  
  803.  
  804. void l_oracle()
  805. {
  806.   char response;
  807.   if (gamestatusp(ATTACKED_ORACLE) && (! gamestatusp(COMPLETED_ASTRAL))) {
  808.     print1("You come before a blue crystal dais. You see a broken mirror.");
  809.     print2("Look in the mirror? [yn] ");
  810.     if (ynq2()=='y') {
  811.       print1("A strange force rips you from your place....");
  812.       Player.hp = 1;
  813.       print2("You feel drained....");
  814.       dataprint();
  815.       print3("You find yourself in a weird flickery maze.");
  816.       change_environment(E_ASTRAL);
  817.     }
  818.   }
  819.   else {
  820.     print1("You come before a blue crystal dais. There is a bell and a mirror.");
  821.     print2("Ring the bell [b], look in the mirror [m], or leave [ESCAPE] ");
  822.     do response = (char) mcigetc();
  823.     while ((response != 'b') && (response != 'm') && (response != ESCAPE));
  824.     if (response == 'b') {
  825.       print1("The ringing note seems to last forever.");
  826.       print2("You notice a robed figure in front of you....");
  827.       morewait();
  828.       print1("The oracle doffs her cowl. Her eyes glitter with blue fire!");
  829.       print2("Attack her? [yn] ");
  830.       if (ynq2() == 'y') {
  831.     setgamestatus(ATTACKED_ORACLE);
  832.     print1("The oracle deftly avoids your attack.");
  833.     print2("She sneers at you and vanishes.");
  834.       }
  835.       else {
  836.     print2("She stares at you...and speaks:");
  837.     if (!gamestatusp(SPOKE_TO_DRUID)) {
  838.       print3("'The ArchDruid speaks wisdom in his forest shrine.'");
  839.     }
  840.     else if (!gamestatusp(COMPLETED_CAVES)) {
  841.       print3("'Thou mayest find aught of interest in the caves to the South.'");
  842.     }
  843.     else if (!gamestatusp(COMPLETED_SEWERS)) {
  844.       print3("'Turn thy attention to the abyssal depths of the city.'");
  845.     }
  846.     else if (!gamestatusp(COMPLETED_CASTLE)) {
  847.       print3("'Explorest thou the depths of the Castle of the ArchMage.'");
  848.     }
  849.     else if (!gamestatusp(COMPLETED_ASTRAL)) {
  850.       morewait();
  851.       print1("'Journey to the Astral Plane and meet the Gods' servants.'");
  852.       print2("The oracle holds out her hand. Do you take it? [yn] ");
  853.       if (ynq2()=='y') {
  854.         print1("'Beware: Only the Star Gem can escape the Astral Plane.'");
  855.         print2("A magic portal opens behind the oracle. She leads you");
  856.         morewait();
  857.         print1("through a sequence of special effects that would have");
  858.         print2("IL&M technicians cursing in awe and deposits you in an");
  859.         morewait();
  860.         clearmsg();
  861.         print1("odd looking room whose walls seem strangely insubstantial.");
  862.         gain_experience(5000);
  863.         change_environment(E_ASTRAL);
  864.       }
  865.       else print3("You detect the hint of a sneer from the oracle.");
  866.     }
  867.     else if (!gamestatusp(COMPLETED_VOLCANO)) {
  868.       print3("'The infernal maw may yield its secrets to thee now.'");
  869.     }
  870.     else if (!gamestatusp(COMPLETED_CHALLENGE)) {
  871.       print3("'The challenge of adepthood yet awaits thee.'");
  872.     }
  873.     else {
  874.       morewait();
  875.       print1("'My lord: Thou hast surpassed my tutelage forever.");
  876.       print2("Fare thee well.'");
  877.       print3("The oracle replaces her hood and seems to fade away....");
  878.     }
  879.       }
  880.     }
  881.     else if (response == 'm') {
  882.       print1("You seem to see yourself. Odd....");
  883.       knowledge(1);
  884.     }
  885.     else print2("You leave this immanent place.");
  886.   }
  887. }
  888.  
  889. void l_mansion()
  890. {
  891.   print1("Enter the mansion? [yn] ");
  892.   if (ynq1()=='y')
  893.     change_environment(E_MANSION);
  894. }
  895.  
  896. void l_house()
  897. {
  898.   print1("Enter the house? [yn] ");
  899.   if (ynq1()=='y')
  900.     change_environment(E_HOUSE);
  901. }
  902.  
  903. void l_hovel()
  904. {
  905.   print1("Enter the hovel? [yn] ");
  906.   if (ynq1()=='y')
  907.     change_environment(E_HOVEL);
  908. }
  909.  
  910. void l_safe()
  911. {
  912.   char response;
  913.   pob newitem;
  914.   int attempt = 0;
  915.   print1("You have discovered a safe!");
  916.   print2("Pick the lock [p], Force the door [f], or ignore [ESCAPE]");
  917.   do response = (char) mcigetc();
  918.   while ((response != 'p') && (response != 'f') && (response != ESCAPE));
  919.   if (response == 'p')
  920.     attempt = (2*Player.dex + Player.rank[THIEVES]*10 - random_range(100))/10;
  921.   else if (response == 'f')
  922.     attempt = (Player.dmg - random_range(100))/10;
  923.   if (attempt > 0) {
  924.     Player.alignment -= 4;
  925.     gain_experience(50);
  926.     print2("The door springs open!");
  927.     Level->site[Player.x][Player.y].locchar = FLOOR;
  928.     Level->site[Player.x][Player.y].p_locf = L_NO_OP;
  929.     lset(Player.x, Player.y, CHANGED);
  930.     if (random_range(2) == 1) {
  931.       print1("You find:");
  932.       do {
  933.     newitem = NULL;
  934.     while (newitem == NULL)
  935.       newitem = create_object(difficulty());
  936.     print2(itemid(newitem));
  937.     morewait();
  938.     gain_item(newitem);
  939.       } while (random_range(3) == 1);
  940.     }
  941.     else print2("The safe was empty (awwwww....)");
  942.   }
  943.   else {
  944.     print3("Your attempt at burglary failed!");
  945.     if (attempt == -1) {
  946.       print1("A siren goes off! You see flashing red lights everywhere!");
  947.       if (Last_Environment == E_CITY) {
  948.     print2("The city guard shows up! They collar you in no time flat!");
  949.     change_environment(E_CITY);
  950.     morewait();
  951.     send_to_jail();
  952.       }
  953.     }
  954.     else if (attempt == -2) {
  955.       print1("There is a sudden flash!");
  956.       p_damage(random_range(25),FLAME,"a safe");
  957.       print2("The safe has self-destructed.");
  958.       Level->site[Player.x][Player.y].locchar = RUBBLE;
  959.       Level->site[Player.x][Player.y].p_locf = L_RUBBLE;
  960.       lset(Player.x, Player.y, CHANGED);
  961.     }
  962.     else if (attempt == -3) {
  963.       print1("The safe jolts you with electricity!");
  964.       lball(Player.x,Player.y,Player.x,Player.y,30);
  965.     }
  966.     else if (attempt < -3) {
  967.       print1("You are hit by an acid spray!");
  968.       if (Player.possessions[O_CLOAK] != NULL) {
  969.     print2("Your cloak is destroyed!");
  970.     conform_lost_object(Player.possessions[O_CLOAK]);
  971.     p_damage(10,ACID,"a safe");
  972.       }
  973.       else if (Player.possessions[O_ARMOR] != NULL) {
  974.     print2("Your armor corrodes!");
  975.     Player.possessions[O_ARMOR]->dmg-=3;
  976.     Player.possessions[O_ARMOR]->hit-=3;
  977.     Player.possessions[O_ARMOR]->aux-=3;
  978.     p_damage(10,ACID,"a safe");
  979.       }
  980.       else {
  981.     print2("The acid hits your bare flesh!");
  982.     p_damage(random_range(100),ACID,"a safe");
  983.       }
  984.     }
  985.   }
  986. }
  987.  
  988.  
  989. void l_cartographer()
  990. {
  991.   int i,j,x,y;
  992.   print1("Ye Olde Mappe Shoppe.");
  993.   print2("Map of the local area: 500Au. Buy it? [yn] ");
  994.   if (ynq2()=='y') {
  995.     if (Player.cash < 500) 
  996.       print3("Cursed be cheapskates! May you never find an aid station....");
  997.     else {
  998.       print3("You now have the local area mapped.");
  999.       Player.cash -= 500;
  1000.       dataprint();
  1001.       switch(Villagenum) {
  1002.       case 1: x = 56; y = 5; break;
  1003.       default: case 2: x = 35; y = 11; break;
  1004.       case 3: x = 10; y = 40; break;
  1005.       case 4: x = 7; y = 6; break;
  1006.       case 5: x = 40; y = 43; break;
  1007.       case 6: x = 20; y = 41; break;
  1008.       }    
  1009.       for(i=x-15;i<=x+15;i++)
  1010.     for(j=y-15;j<=y+15;j++)
  1011.       if ((i>=0)&&(i<64)&&(j>=0)&&(j<64)) {
  1012.         if (Country[i][j].current_terrain_type !=
  1013.           Country[i][j].base_terrain_type) {
  1014.           c_set(i, j, CHANGED);
  1015.           Country[i][j].current_terrain_type =
  1016.         Country[i][j].base_terrain_type;
  1017.         }
  1018.         c_set(i, j, SEEN);
  1019.       }
  1020.     }
  1021.   }
  1022.   else print3("Don't blame me if you get lost....");
  1023. }
  1024.         
  1025. void l_charity()
  1026. {
  1027.   long donation;
  1028.   print2("'Greetings, friend. Do you wish to make a donation?' [yn] ");
  1029.   if (ynq2()!='y') 
  1030.     print3("'Pinchpurse!'");
  1031.   else {
  1032.     clearmsg();
  1033.     print1("How much can you give? ");
  1034.     donation = parsenum();
  1035.     if (donation < 1)
  1036.       print2("'Go stick your head in a pig.'");
  1037.     else if (donation > Player.cash)
  1038.       print2("'I'm afraid you're charity is bigger than your purse!'");
  1039.     else if (donation < max(100,Player.level*Player.level*100)) {
  1040.       print2("'Oh, can't you do better than that?'");
  1041.       print3("'Well, I guess we'll take it....'");
  1042.       if (Player.alignment < 10) Player.alignment++;
  1043.       Player.cash -= donation;
  1044.     }
  1045.     else {
  1046.       print2("'Oh thank you kindly, friend, and bless you!'");
  1047.       Player.cash -= donation;
  1048.       Player.alignment += 5;
  1049.     }
  1050.   }
  1051.   dataprint();
  1052.  
  1053.